package eMdP.gestors;

import java.util.LinkedList;

import com.jmex.bui.BuiSystem;
import com.jmex.game.state.GameStateManager;

import eMdP.classesBasiques.Personatge;
import eMdP.estats.Credits;
import eMdP.estats.GbuiGameState;
import eMdP.estats.GuardarPuntuacions;
import eMdP.estats.MaximesPuntuacions;
import eMdP.estats.MenuConfiguracio;
import eMdP.estats.MenuDePausa;
import eMdP.estats.MenuIniciarPartidaMultiJugador;
import eMdP.estats.MenuIniciarPartidaUnJugador;
import eMdP.estats.MenuPrincipal;
import eMdP.estats.Partida;
import eMdP.estats.ThreeDGameState;

public class GestorPantalla {

	static LinkedList<GbuiGameState> llista;
	
	/**
	 * Metode que crida a la creació de la llista i afegeix els estats amb
	 * el activat o desactivat corresponent al GameStateManager
	 */
	public static void gestioPantalla()
	{
		// Creem la llista
		inicialitzaPantalles();
		
		// Activem el primer estat
		llista.get(0).activate();
		for(int i=0;i<llista.size();i++)
		{
			if(i!=0) // El primer ja està activat, la resta els desactivem
				llista.get(i).deactivate();
			// Afegim al GameStateManager
			GameStateManager.getInstance().attachChild(llista.get(i));
		}
	}
	
	/**
	 * Metode que crea la llista d'estats i hi afegeix tots els estats que
	 * ja poden ser creats perquè no modificarem
	 */
	public static void inicialitzaPantalles()
	{
		// Creem una nova llista
		llista = new LinkedList<GbuiGameState>();
		
		llista.add(new MenuPrincipal("Menu Principal"));
		llista.add(new ThreeDGameState("Pantalla"));
		llista.add(new MenuConfiguracio("Menu Configuracio"));
		llista.add(new MenuIniciarPartidaUnJugador("Iniciar partida un jugador"));
		llista.add(new MenuDePausa("Menu de Pausa"));
		llista.add(new MenuIniciarPartidaMultiJugador("Iniciar partida multi-jugador"));
		llista.add(new Credits("Credits"));
		llista.add(new MaximesPuntuacions("Maximes puntuacions"));
	}
	
	public static void canvia(int estatActual, int estatSeguent)
	{
		llista.get(estatSeguent).activate();
		llista.get(estatActual).deactivate();
	}
	
	public static void iniciaPartida(int idPlayer, int idEscena, int mode)
	{
		llista.add(new Partida(idPlayer, idEscena, mode));
		GameStateManager.getInstance().attachChild(llista.getLast());
		llista.getLast().activate();
		llista.get(3).deactivate();
	}
	
	/**
	 * Metode que crea i inicialitza una partida multijugador
	 * @param idPlayers vector d'enters amb els id's dels personatges (-1 si no juga)
	 * @param idEscena enter amb l'id de l'escena
	 * @param mode enter amb el mod (veure constants per als modes)
	 */
	public static void iniciaPartida(int[] idPlayers, int idEscena, int mode)
	{
		// Creem la nova partida i l'afegim al GameState
		llista.add(new Partida(idPlayers, idEscena, mode));
		GameStateManager.getInstance().attachChild(llista.getLast());
		// Activem la última partida i desactivem el menú corresponent
		llista.getLast().activate();
		llista.get(5).deactivate();
	}
	
	public static void esborraLlista()
	{
		for(int i=0;i<llista.size();i++)
			if(llista.get(i).isActive())
				llista.get(i).deactivate();
		llista.removeAll(llista);
		System.out.println("Mida llista: "+llista.size());
	}
	
	public static void rependrePartida()
	{
		llista.getLast().setActive(true);
		llista.get(4).deactivate();
	}
	
	public static void abortarPartida()
	{
		llista.get(0).activate();
		llista.getLast().deactivate();
		llista.get(4).deactivate();
	}
	
	public static boolean esActivaPartida()
	{
		return GameStateManager.getInstance().getChild(llista.size()-1).isActive();
	}
	
	public static void pausarPartida()
	{
		llista.get(4).activate();
		llista.getLast().setActive(false);
	}
	
	public static LinkedList<GbuiGameState> getLlista()
	{
		return llista;
	}
	
	public static void guardarPuntuacions(Personatge p, String escenari, int mode, float puntuacio)
	{
		llista.getLast().deactivate();
		llista.removeLast();
		llista.add(new GuardarPuntuacions("Guardar puntuacions", mode, p, escenari, (int)puntuacio));
		llista.getLast().activate();
		GameStateManager.getInstance().attachChild(llista.getLast());
	}
}
